home *** CD-ROM | disk | FTP | other *** search
/ MacGames Sampler / PHT MacGames Bundle.iso / MacSource Folder / Samples from the CD / Assembly / Mac68k / XAMP.S / CYSUB.S < prev    next >
Encoding:
Text File  |  1985-08-20  |  11.5 KB  |  483 lines  |  [TEXT/Anon]

  1. SUBS     SUBTTL     SHELL/EDITOR SUBROUTINES.
  2. DSH8     SPACE     4,10
  3. **     DSH8 - DISPLAY 8-BIT HEX NUMBER TO CONSOLE.
  4. *
  5. *        ENTRY   D2.B = 8-BIT HEX NUMBER.
  6.  
  7. DSH8     MOVE    D2,D1
  8.      AND     #$00F0,D1    ;LEFT NIBBLE
  9.      LSR     #4,D1
  10.      MOVE.B  DSH8A(PC,D1),D0 ;HEX CHARACTER
  11.      JSR     IOWCH(PC)
  12.      MOVEQ   #$0F,D0
  13.      AND     D2,D0        ;RIGHT NIBBLE
  14.      MOVE.B  DSH8A(PC,D0),D0
  15.      JSR     IOWCH(PC)
  16.      RTS
  17.  
  18. DSH8A    DC.B     #H'0123456789ABCDEF'
  19. DSH16     SPACE     4,10
  20. **       DSH16 - DISPLAY HEX WORD.
  21. *
  22. *        ENTRY   D6 = 16-BIT HEX VALUE.
  23.  
  24. DSH16    MOVE    D6,D2
  25.      LSR     #8,D2
  26.      BSR     DSH8        ;DISPLAY UPPER 8 BITS
  27.      MOVE.B  D6,D2
  28.      BSR     DSH8
  29.      RTS
  30. GETF     SPACE     4,10
  31. **       GETF - USE SFGETFILE TO SELECT A FILE.
  32. *
  33. *     EXIT     CCR - 0 IF NO VALID FILE NAME SELECTED.
  34.  
  35. GETF     MOVE.L  GETFA(PC),-(SP) ;WHERE TO PLACE INQUIRY BOX
  36.      PEA     GETFB(PC)    ;TITLE
  37.      CLR.L   -(SP)        ;NO FILE FILTERING
  38.      MOVE    #1,-(SP)    ;DISPLAY ONLY TEXT FILES
  39.      PEA     GETFC(PC)
  40.      CLR.L     -(SP)
  41.      PEA     SFREPLY(A6)
  42.      MOVE    #2,-(SP)       ;SFGETFILE
  43.      _Pack3
  44.      TST.B   SFGOOD(A6)
  45.      BEQ.S     GETFX        ;IF NO FILE SELECTED
  46.      MOVE.L     EDITF(A6),A1
  47.      LEA     SFNAME(A6),A4    ;FILE NAME SELECTED
  48.      CLR     D0
  49.      MOVE.B     (A4)+,D0
  50.      CLR.B     0(A4,D0)    ;SET TRAILING ZERO BYTE
  51.      MOVE.B     (A4)+,D0
  52.      BSR     VALF        ;SET UP FIT
  53.      BEQ.S     GETFX        ;IF INVALID NAME
  54.      MOVE     SFVREFN(A6),FFPB+ioVRefNum(A1)  ;SET VOLUME NUMBER
  55.      MOVEQ     #1,D1
  56. GETFX     RTS
  57.  
  58. GETFA    DC     40,40        ;UPPER LEFT POINT OF DIALOG BOX
  59. GETFB     STR     'Select an Edit File'
  60. GETFC     DC     #'TEXT'
  61. GETS     SPACE     4,10
  62. **       GETS - USE SFPUTFILE TO SELECT A FILE.
  63. *
  64. *     EXIT     CCR - 0 IF NO VALID FILE NAME SELECTED.
  65.  
  66. GETS     MOVE.L  GETFA(PC),-(SP) ;WHERE TO PLACE INQUIRY BOX
  67.      PEA     GETSB(PC)    ;TITLE
  68.      MOVE.L     EDITF(A6),A1
  69.      MOVE.L     FFPB+ioFileName(A1),-(SP)  ;FILE NAME
  70.      CLR.L   -(SP)        ;NO DIALOG HOOK
  71.      PEA     SFREPLY(A6)
  72.      MOVE    #1,-(SP)       ;SFPUTFILE
  73.      _Pack3
  74.      TST.B   SFGOOD(A6)
  75.      BEQ.S     GETSX        ;IF NO FILE SELECTED
  76.      MOVE.L     EDITT(A6),A1
  77.      LEA     SFNAME(A6),A4    ;FILE NAME SELECTED
  78.      CLR     D0
  79.      MOVE.B     (A4)+,D0
  80.      CLR.B     0(A4,D0)    ;SET TRAILING ZERO BYTE
  81.      MOVE.B     (A4)+,D0
  82.      BSR     VALF        ;SET UP FIT
  83.      BEQ.S     GETSX        ;IF INVALID NAME
  84.      MOVE     SFVREFN(A6),FFPB+ioVRefNum(A1)  ;SET VOLUME NUMBER
  85.      MOVEQ     #1,D1
  86. GETSX     RTS
  87.  
  88. GETSB     STR     'Select a Save File Name'
  89. IFEM     SPACE     4,10
  90. **       IFEM - ISSUE FILE ERROR MESSAGE.
  91. *
  92. *        ENTRY   A1 - FIT.
  93. *         A3 - ERROR MESSAGE.
  94.  
  95. IFEM     BSR.S   IFN        ;BUILD ERROR MESSAGE
  96.      BSR     WZL        ;ISSUE MESSAGE
  97.      JSR     IOWCR(PC)
  98.      RTS
  99. IFN     SPACE     4,10
  100. **       IFN - INSERT FILE NAME.
  101. *
  102. *        ENTRY   A1 - FIT.
  103. *         A4 - DESTINATION BUFFER ADDRESS.
  104.  
  105. IFN      LEA     SCRS(A6),A4
  106. IFN1     MOVE.B  (A3)+,(A4)+    ;TRANSFER MESSAGE
  107.      BNE     IFN1
  108.      SUBQ.L  #1,A4
  109.      MOVEQ   #8-1,D7
  110.      MOVEQ   #' ',D6
  111.      LEA     FSTR(A1),A0    ;FILE NAME
  112.      MOVE.B  (A0)+,D7       ;LENGTH
  113.      SUBQ    #1,D7
  114.      BLT.S   IFNX
  115. IFN2     MOVE.B  (A0)+,(A4)+    ;TRANSFER NAME
  116.      DBF     D7,IFN2
  117. IFNX     CLR.B   (A4)+
  118.      LEA     SCRS(A6),A3
  119.      RTS
  120. IFE     SPACE     4,10
  121. **       IFE - INSERT FILE ERROR CODE.
  122.  
  123. IFE      LEA     IFEA(PC),A3
  124.      SUBQ    #1,A4
  125. IFE1     MOVE.B  (A3)+,(A4)+    ;TRANSFER *ERR - *
  126.      BNE     IFE1
  127.      SUBQ    #1,A4
  128.      MOVE    D0,D1
  129.      BPL.S   IFE2        ;IF POSITIVE CODE
  130.      MOVE.B  #'-',(A4)+
  131.      NEG     D1
  132.      NEG     D0
  133. IFE2     AND     #$00F0,D1
  134.      LSR     #4,D1
  135.      MOVE.B  IFEB(PC,D1),(A4)+
  136.      AND     #$000F,D0
  137.      MOVE.B  IFEB(PC,D0),(A4)+
  138.      CLR.B   (A4)
  139.      LEA     SCRS(A6),A3
  140.      RTS
  141.  
  142. IFEA     DC.L     #Z'       ERR# '
  143. IFEB     DC.B     #H'0123456789ABCDEF'
  144. OBF     SPACE     4,10
  145. **       OBF - OPEN FILE.
  146. *
  147. *        ENTRY   A1 - FIT.
  148. *
  149. *        EXIT    CCR - .EQ. IF FILE OPEN.
  150.  
  151. OBFW     MOVEQ   #2,D0        ;WRITE ACCESS
  152.      BRA.S   OBF1
  153. OBF      MOVEQ   #3,D0        ;READ ACCESS
  154. OBF1     JSR     IOOPEN(PC)
  155.      BEQ.S   OBFX        ;IF OPEN
  156.      MOVE    D0,D5
  157.      LEA     EMOPN(PC),A3    ;*UNABLE TO OPEN*
  158.      BSR     IFEM
  159.      MOVE    D5,D0
  160. OBFX     RTS
  161. OBFR     SPACE     4,10
  162. **       OBFR - OPEN FILE RESOURCE FORK.
  163. *
  164. *        ENTRY   A1 - FIT.
  165. *
  166. *        EXIT    CCR - .EQ. IF FILE OPEN.
  167.  
  168. OBFRW    MOVEQ   #2,D0        ;WRITE ACCESS
  169.      BRA.S   OBFR1
  170. OBFR     MOVEQ   #3,D0        ;READ ACCESS
  171. OBFR1    JSR     IOOPENR(PC)
  172.      BEQ.S   OBFRX        ;IF OPEN
  173.      LEA     EMOPN(PC),A3    ;*UNABLE TO OPEN*
  174.      BSR     IFEM
  175.      MOVEQ   #1,D0
  176. OBFRX    RTS
  177. RETURN     SPACE     4,10
  178. *        RETURN - RELEASE RESOURCES AND END PROGRAM.
  179.  
  180. RETURN   MOVE.L  EDTE(A6),-(SP)    ;RELEASE TE RESOURCES
  181.      _TEDispose
  182.      MOVE.L  EDWN(A6),-(SP)
  183.      _KillControls
  184.      MOVE.L  EDWN(A6),-(SP)    ;RELEASE WINDOW
  185.      _CloseWindow
  186.  
  187. RMENU     MOVEQ     #6+1,D7    ;CLEAR MENU BAR
  188. RMEN1     SUBQ     #1,D7
  189.      BEQ.S     RMENUX        ;IF ALL COLUMNS PROCESSED
  190.      CLR.L   -(SP)
  191.      MOVE    D7,-(SP)
  192.      _GetMHandle        ;GET MENU COLUMN HANDLE
  193.      MOVE.L     (SP)+,D3
  194.      BEQ     RMEN1        ;IF COLUMN NOT ACTIVE
  195.      MOVE.L     D3,-(SP)
  196.      MOVE    D7,-(SP)
  197.      _DeleteMenu        ;RELEASE RESOURCES
  198.      _DisposMenu
  199.      BRA     RMEN1
  200. RMENUX     _DrawMenuBar        ;DRAW CLEARED BAR
  201.      _InitCursor
  202.      RTS
  203. RWB     SPACE     4,10
  204. **     RWB - RUN WARNING BOX.
  205. *
  206.  
  207. RWB      LEA     PRMP+14(PC),A2  ;INSERT PROMPT
  208.      MOVEQ   #-1,D0
  209.      MOVE.L  A2,A4
  210. RWB1     ADDQ    #1,D0
  211.      MOVE.B  (A3)+,(A4)+     ;TRANSFER PROMPT MESSAGE
  212.      BNE     RWB1
  213.      LEA     PRMP+13(PC),A2
  214.      MOVE.B  D0,(A2)
  215.      LEA     RWBC(PC),A4     ;DIALOG LIST
  216.      MOVE.L  A4,-(A4)        ;PTR
  217.      MOVE.L  A4,-(A4)        ;HANDLE
  218.      CLR.L   -(SP)
  219.      PEA     ALRTB(A6)       ;ALERT BOX RECORD
  220.      PEA     RWBA(PC)        ;BOX BOUNDS
  221.      CLR.L   -(SP)         ;TITLE
  222.      MOVE.B  #1,-(SP)        ;VISIBLE
  223.      MOVE    #1,-(SP)        ;MODAL DIALOG BOX
  224.      MOVE.L  #-1,-(SP)       ;ON TOP
  225.      MOVE.B  #0,-(SP)        ;NO GO AWAY BOX
  226.      CLR.L   -(SP)
  227.      MOVE.L  RWBB(PC),-(SP)
  228.      _NewDialog         ;CREATE DIALOG WINDOW
  229.      MOVE.L  (SP)+,DLWN(A6)
  230.  
  231. *        ADD CONTROL BOXES.
  232.  
  233.      CLR.L   -(SP)
  234.      MOVE.L  DLWN(A6),-(SP)  ;DIALOG WINDOW
  235.      PEA     WOKB+L(PC)      ;RECT
  236.      PEA     OK(PC)      ;TITLE
  237.      MOVE.B  #1,-(SP)        ;VISIBLE
  238.      CLR     -(SP)       ;VALUE
  239.      CLR     -(SP)       ;MIN
  240.      CLR     -(SP)
  241.      MOVE    #0,-(SP)        ;SIMPLE PUSH BUTTON
  242.      CLR.L   -(SP)
  243.      _NewControl
  244.      LEA     WOKB(PC),A2     ;CONTROL HANDLE
  245.      MOVE.L  (SP)+,(A2)
  246.  
  247. *        RUN WARNING BOX.
  248.  
  249.      LEA     ITEMHIT(A6),A3
  250. RWB2     CLR.L   -(SP)       ;NO FILTER
  251.      MOVE.L  A3,-(SP)
  252.      _ModalDialog
  253.      MOVE    (A3),D0     ;ITEM SELECTED
  254.      BLE     RWB2
  255.  
  256. *        CLEAN UP.
  257.  
  258.      MOVE.L  DLWN(A6),-(SP)
  259.      _KillControls        ;RELEASE DIALOG CONTROLS
  260.      MOVE.L  DLWN(A6),-(SP)
  261.      _CloseDialog        ;RELEASE DIALOG STRUCTURES
  262.      RTS
  263.  
  264. RWBA     DC     40,100,100,400
  265. RWBB     DS.L     1        ;HANDLE
  266.      DS.L     1        ;PTR
  267. RWBC     DC     2-1        ;NUMBER OF ITEMS
  268. WOKB     DC.L     0        ;OK BUTTON
  269.      DC     35,200,53,260
  270.      DC.B     4
  271.      DC.B     0
  272. PRMP     DC.L     0        ;PROMPT
  273.      DC     05,20,23,290
  274.      DC.B     8
  275.      DC.B     0
  276.      DS.B     50        ;PROMPT TEXT
  277. OK       STR     'OK'
  278. RYN     SPACE     4,10
  279. **     RYN - RUN YES/NO BOX.
  280. *
  281. *     ENTRY     A3 - PROMPT.
  282. *    
  283. *     EXIT     CCR - 0 IF *CANCEL* SELECTED.
  284.  
  285. RYN      LEA     YNPR+14(PC),A2  ;INSERT PROMPT
  286.      MOVEQ   #-1,D0
  287.      MOVE.L  A2,A4
  288. RYN1     ADDQ    #1,D0
  289.      MOVE.B  (A3)+,(A4)+     ;TRANSFER PROMPT MESSAGE
  290.      BNE     RYN1
  291.      LEA     YNPR+13(PC),A2
  292.      MOVE.B  D0,(A2)
  293.      LEA     RYNC(PC),A4     ;DIALOG LIST
  294.      MOVE.L  A4,-(A4)        ;PTR
  295.      MOVE.L  A4,-(A4)        ;HANDLE
  296.      CLR.L   -(SP)
  297.      PEA     ALRTB(A6)       ;ALERT BOX RECORD
  298.      PEA     RWBA(PC)        ;BOX BOUNDS
  299.      CLR.L   -(SP)         ;TITLE
  300.      MOVE.B  #1,-(SP)        ;VISIBLE
  301.      MOVE    #1,-(SP)        ;MODAL DIALOG BOX
  302.      MOVE.L  #-1,-(SP)       ;ON TOP
  303.      MOVE.B  #0,-(SP)        ;NO GO AWAY BOX
  304.      CLR.L   -(SP)
  305.      MOVE.L  RYNB(PC),-(SP)
  306.      _NewDialog         ;CREATE DIALOG WINDOW
  307.      MOVE.L  (SP)+,DLWN(A6)
  308.  
  309. *        ADD CONTROL BOXES.
  310.  
  311.      CLR.L   -(SP)
  312.      MOVE.L  DLWN(A6),-(SP) ;DIALOG WINDOW
  313.      PEA     YNOK+L(PC)     ;RECT
  314.      PEA     OK(PC)        ;TITLE
  315.      MOVE.B  #1,-(SP)       ;VISIBLE
  316.      CLR     -(SP)        ;VALUE
  317.      CLR     -(SP)        ;MIN
  318.      CLR     -(SP)
  319.      MOVE    #0,-(SP)    ;SIMPLE PUSH BUTTON
  320.      CLR.L   -(SP)
  321.      _NewControl
  322.      LEA     YNOK(PC),A2     ;CONTROL HANDLE
  323.      MOVE.L  (SP)+,(A2)
  324.  
  325.      CLR.L   -(SP)
  326.      MOVE.L  DLWN(A6),-(SP) ;DIALOG WINDOW
  327.      PEA     YNCN+L(PC)     ;RECT
  328.      PEA     CANCEL(PC)    ;TITLE
  329.      MOVE.B  #1,-(SP)       ;VISIBLE
  330.      CLR     -(SP)        ;VALUE
  331.      CLR     -(SP)        ;MIN
  332.      CLR     -(SP)
  333.      MOVE    #0,-(SP)    ;SIMPLE PUSH BUTTON
  334.      CLR.L   -(SP)
  335.      _NewControl
  336.      LEA     YNCN(PC),A2     ;CONTROL HANDLE
  337.      MOVE.L  (SP)+,(A2)
  338.  
  339. *        RUN WARNING BOX.
  340.  
  341.      LEA     ITEMHIT(A6),A3
  342. RYN2     CLR.L   -(SP)        ;NO FILTER
  343.      MOVE.L  A3,-(SP)
  344.      _ModalDialog
  345.      MOVE    (A3),D7    ;ITEM SELECTED
  346.      BLE     RYN2
  347.  
  348. *        CLEAN UP.
  349.  
  350.      MOVE.L  DLWN(A6),-(SP)
  351.      _KillControls        ;RELEASE DIALOG CONTROLS
  352.      MOVE.L  DLWN(A6),-(SP)
  353.      _CloseDialog        ;RELEASE DIALOG STRUCTURES
  354.      SUB     #2,D7        ;TEST FOR CANCEL
  355.      RTS
  356.  
  357. RYNB     DS.L     1        ;HANDLE
  358.      DS.L     1        ;PTR
  359. RYNC     DC     3-1        ;NUMBER OF ITEMS
  360. YNOK     DC.L     0        ;OK BUTTON
  361.      DC     35,200,53,260
  362.      DC.B     4
  363.      DC.B     0
  364. YNCN     DC.L     0        ;CANCEL BUTTON
  365.      DC     35,120,53,180
  366.      DC.B     4
  367.      DC.B     0
  368. YNPR     DC.L     0        ;PROMPT
  369.      DC     05,20,23,290
  370.      DC.B     8
  371.      DC.B     0
  372.      DS.B     50        ;PROMPT TEXT
  373. VALF     SPACE     4,10
  374. **       VALF - VALIDATE FILE NAME.
  375. *
  376. *        ENTRY   A1 - FIT.
  377. *         A4 - FILE NAME.
  378. *         D0 - FIRST CHARACTER OF FILE NAME.
  379. *
  380. *        EXIT    CCR - .EQ. IF NAME OK.
  381. *               .GT. IF ERROR IN FILE NAME.
  382. *                .LT. IF ERROR IN DRIVE NAME.
  383.  
  384. VALF     MOVE.B  D0,D4
  385.      LEA     BLANKS(PC),A3    ;INITIALIZE FIT NAME WITH BLANKS
  386.      JSR     IOSFN(PC)
  387.      LEA     SCRS(A6),A0
  388.      MOVE.L  (A3),(A0)    ;INITIALIZE ACCUMULATION AREA
  389.      MOVE.L  (A3),L(A0)
  390.      MOVE.L  D5,D(A0)
  391.      CLR.L   D0
  392.       MOVE.B  D4,D0
  393.      MOVEQ   #8,D7
  394.      MOVEQ   #' ',D6
  395. VALF1    CMP.B     #'.',D0
  396.      BEQ.S   VALF4        ;IF POSSIBLE EXTENSION
  397.      CMP.B   D6,D0
  398.      BEQ.S   VALF8        ;IF END OF NAME
  399.      SUBQ    #1,D7
  400.      BLT     VALF9        ;IF NAME TOO LONG
  401.      CMP.B     #'a',D0
  402.      BMI.S   VALF2        ;IF UPPER CASE
  403.      SUB.B     #'a'-'A',D0
  404. VALF2    CMP     D6,D0
  405.      BMI.S   VALF9        ;IF CONTROL CHARACTER
  406.      CMP.B     #'1',D0
  407.      BGE.S   VALF3        ;IF ALPHANUMERIC
  408.      CMP.B   #'.',D0
  409.      BEQ     VALF8        ;IF END OF NAME
  410. VALF3    CMP.B     #'Z',D0
  411.      BGT.S   VALF9
  412.      MOVE.B  D0,(A0)+    ;COLLECT NAME
  413.      MOVE.B  (A4)+,D0
  414.      BNE     VALF1
  415.      BRA.S   VALF8        ;END OF NAME AND NO EXTENSION PRESENT
  416.  
  417. *        ASSEMBLE AND CHECK EXTENSION NAME.
  418.  
  419. VALF4    SUBQ    #8,D7
  420.      BEQ.S   VALF9        ;IF NO FILE NAME
  421.      LEA     SCRS+D+1(A6),A3
  422.      MOVE.L  BLANKS(PC),-1(A3)
  423.      MOVE.L  A3,A0
  424.      MOVEQ   #3,D7
  425. VALF5    MOVE.B  (A4)+,D0
  426.      BEQ.S   VALF8        ;IF END OF EXTENSION
  427.      CMP.B   D6,D0
  428.      BEQ.S   VALF6
  429.      SUBQ    #1,D7
  430.      BLT.S   VALF9        ;IF NAME TOO LONG
  431.      CMP.B     #'a',D0
  432.      BMI.S   VALF6        ;IF UPPER CASE
  433.      SUB.B   #'a'-'A',D0
  434. VALF6    CMP.B   D6,D0
  435.      BMI.S   VALF9        ;IF CONTROL CHARACTER
  436.      CMP.B   #'1',D0
  437.      BGE.S   VALF7
  438.      NOP
  439. VALF7    CMP.B   #'Z',D0
  440.      BGT.S   VALF9
  441.      MOVE.B  D0,(A0)+    ;COLLECT EXTENSION NAME
  442.      BRA     VALF5
  443.  
  444. *        SET FILE NAME INTO FIT.
  445.  
  446. VALF8    LEA     SCRS(A6),A3    ;FILE NAME
  447.      MOVE.L  SCRS+D(A6),D5    ;EXTENSION
  448.      JSR     IOSFN(PC)    ;SET INTO FIT
  449.      MOVEQ   #1,D0
  450.      RTS
  451.  
  452. *        ERROR IN FILE NAME.
  453.  
  454. VALF9    LEA     EMFLN(PC),A3    ;*INVALID FILE NAME*
  455.      BSR     IFEM
  456.      CLR     D0
  457.      RTS
  458. WSTR     SPACE     4,10
  459. **       WSTR - WRITE STRING.
  460. *
  461. *        ENTRY   A4 - STRING POINTER.
  462.  
  463. WSTR     MOVE.B  (A4)+,D7    ;STRING LENGTH
  464.      BEQ.S   WSTRX        ;IF NULL
  465.      CLR     D0
  466. WSTR1    MOVE.B  (A4)+,D0    ;GET NEXT CHARACTER
  467.      JSR     IOWCH(PC)    ;WRITE TO SCREEN
  468.      SUBQ.B  #1,D7
  469.      BNE     WSTR1        ;IF NOT AT END OF STRING
  470. WSTRX    RTS
  471. WZL     SPACE     4,10
  472. **       WZL - WRITE ZERO BYTE TERMINATED STRING.
  473. *
  474. *        ENTRY   A3 - ZERO BYTE TERMINATED STRING.
  475.  
  476. WZL      MOVE.B  (A3)+,D0
  477.      BEQ.S   WZL1        ;IF END OF STRING
  478.      JSR     IOWCH(PC)
  479.      BRA     WZL
  480. WZL1     RTS
  481.  
  482. *     END OF CYCLAN SUBROUTINES.
  483.